package com.skilltrack.enrol.api;

import com.skilltrack.enrol.model.dto.SaveTeachplanDto;
import com.skilltrack.enrol.model.dto.TeachplanDto;
import com.skilltrack.enrol.service.TeachplanService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @author LENOVO
 * @version 1.0
 * @date 2025/3/25 下午8:36
 */
@Api(value = "课程计划信息管理接口", tags = "课程计划信息管理接口")
@RestController
@Slf4j
public class TeachplanController {

    @Autowired
    private TeachplanService teachplanService;

    /**
     * 查询课程计划
     *
     * 根据课程Id查询课程计划的树形结构节点信息
     * 此方法使用GET请求，通过课程Id参数获取课程计划数据，并返回一个编辑课程DTO列表
     * 主要用于课程计划的展示或编辑前的数据准备
     *
     * @param courseId 课程Id，用于指定要查询的课程计划所属的课程
     * @return 返回一个EditCourseDto对象列表，包含课程计划的树形结构节点信息
     */
    @ApiOperation(value = "查询课程计划")
    @ApiImplicitParam(value = "courseId", name = "课程Id", required = true, dataType = "Long", paramType = "path")
    @GetMapping("/teachplan/{courseId}/tree-nodes")
    public List<TeachplanDto> getTreeNodes(@PathVariable Long courseId) {
        return teachplanService.findTeachplanTree(courseId);
    }

    /**
     * 新增或修改课程计划
     * 此接口用于接收课程计划的相关信息，并将其保存或更新在系统中
     * 它可以根据传入的数据识别是新增计划还是修改现有计划
     *
     * @param saveTeachplanDto 课程计划的详细信息，包括课程内容、时间安排等
     *                         这些信息通过请求体（RequestBody）传递给后端
     */
    @ApiOperation(value = "新增或修改课程计划")
    @PostMapping("/teachplan")
    public  void saveTeachplan(@RequestBody SaveTeachplanDto saveTeachplanDto){
        teachplanService.saveTeachplan(saveTeachplanDto);
    }

    /**
     * 删除指定的课程计划
     * 此方法通过ID标识课程计划，并将其从系统中删除
     * 使用DeleteMapping注解限定HTTP DELETE请求，以符合RESTful设计原则
     *
     * @param teachplanId 课程计划的唯一标识符，通过URL路径变量传递
     */
    @ApiOperation(value = "删除课程计划")
    @DeleteMapping("/teachplan/{teachplanId}")
    public void deleteTeachplan(@PathVariable Long teachplanId){
        teachplanService.deleteTeachplan(teachplanId);
    }



    /**
     * 根据给定的方向和ID移动课程计划
     * 此方法允许通过REST API端点来调整课程计划的顺序，具体是向下移动
     *
     * @param move 移动的方向，此处应为"down"，表示向下移动
     * @param teachplanId 需要移动的课程计划的ID
     */
    @ApiOperation(value = "课程计划下移")
    @PostMapping("/teachplan/{move}/{teachplanId}")
    public void move(@PathVariable String move, @PathVariable Long teachplanId){
        teachplanService.move(move,teachplanId);
    }





}